package reflect;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectDemo7 {
    public static void main(String[] args) throws Exception {
        //        Person p = new Person();
//        p.hehe();//在类的外部不可以引用类的私有成员
        Class cls = Class.forName("reflect.Person");
        Object obj = cls.newInstance();
        /*
            当我们使用Class的getMethod方法获取一个类的私有方法时,会抛出下面异常:
            java.lang.NoSuchMethodException
                      没有这个方法异常
            原因:
            getMethod()方法仅能获取类对象表示的类的所有公开方法(包括从超类继承的方法)

            Class类对象有一组可以获取本类自己定义的成员
            getDeclaredXXXX()
            例如:
            getDeclaredMethods()
            能获取到类对象表示的类中定义的所有方法(包括私有方法,不包含超类继承的)

            getDeclaredMethod(String name,Class... pt)
         */
//        Method method = cls.getMethod("hehe");
        Method method = cls.getDeclaredMethod("hehe");
        if (method.getModifiers() == Modifier.PRIVATE) {
            method.setAccessible(true);//强行打开访问权限
            method.invoke(obj);//obj.hehe
            method.setAccessible(false);//用完了应当关闭权限(好习惯)

        }else {
            method.invoke(obj);
        }
    }
}
